package org.ehe.finance.voucher.mapper;

import org.apache.ibatis.annotations.Param;
import org.ehe.common.mybatis.core.mapper.BaseMapperPlus;
import org.ehe.finance.voucher.domain.ErpFinanceVoucher;
import org.ehe.finance.voucher.domain.vo.ErpFinanceVoucherVo;

import java.time.LocalDate;
import java.util.List;

/**
 * @author :zhangnn
 * @className :ErpFinanceVoucherMapper
 * @description: TODO
 * @date 2025-08-25 09:34:30
 */
/**
 * 记账凭证Mapper接口
 * @author zhangnn
 * @date 2025-08-25
 */
public interface ErpFinanceVoucherMapper extends BaseMapperPlus<ErpFinanceVoucher, ErpFinanceVoucherVo> {

    /**
     * 根据凭证类别和期间获取最大凭证序号
     * @param voucherTypeId 凭证类别ID
     * @param period 期间
     * @return 最大序号
     */
    Integer getMaxSequenceByTypeAndPeriod(@Param("voucherTypeId") Long voucherTypeId,
                                          @Param("period") String period);

    /**
     * 检查凭证号是否存在
     * @param voucherNo 凭证号
     * @param excludeId 排除的凭证ID
     * @return 数量
     */
    Long checkVoucherNoExists(@Param("voucherNo") String voucherNo,
                              @Param("excludeId") Long excludeId);

    /**
     * 根据期间获取凭证列表
     * @param period 期间
     * @return 凭证列表
     */
    List<ErpFinanceVoucherVo> selectVouchersByPeriod(@Param("period") String period);

    /**
     * 获取期间内凭证状态统计
     * @param period 期间
     * @return 统计结果
     */
    List<VoucherStatusCount> getVoucherStatusCountByPeriod(@Param("period") String period);

    /**
     * 根据来源单据查询凭证
     * @param sourceId 来源单据ID
     * @param sourceNo 来源单据号
     * @return 凭证列表
     */
    List<ErpFinanceVoucherVo> selectVouchersBySource(@Param("sourceId") Long sourceId,
                                                     @Param("sourceNo") String sourceNo);

    /**
     * 获取用户的待审核凭证数量
     * @param userId 用户ID
     * @return 数量
     */
    Long getPendingReviewCount(@Param("userId") Long userId);

    /**
     * 批量更新凭证状态
     * @param ids 凭证ID列表
     * @param status 目标状态
     * @param operatorId 操作员ID
     * @return 更新数量
     */
    int batchUpdateStatus(@Param("ids") List<Long> ids,
                          @Param("status") Integer status,
                          @Param("operatorId") Long operatorId);

    /**
     * 更新
     * @param voucherId
     */
    void updateVoucherTotals(Long voucherId);

    /**
     * 凭证状态统计内部类
     */
    class VoucherStatusCount {
        private Integer status;
        private String statusName;
        private Long count;

        // getters and setters
        public Integer getStatus() { return status; }
        public void setStatus(Integer status) { this.status = status; }
        public String getStatusName() { return statusName; }
        public void setStatusName(String statusName) { this.statusName = statusName; }
        public Long getCount() { return count; }
        public void setCount(Long count) { this.count = count; }
    }
}
